package com.example.stock.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;

import java.util.Set;

@Service
public class RedisService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    // 获取ZSet操作对象
    private ZSetOperations<String, Object> zSetOps() {
        return redisTemplate.opsForZSet();
    }

    // 1. 添加元素到有序集合
    public Boolean add(String key, Object value, double score) {
        return zSetOps().add(key, value, score);
    }

    // 2. 批量添加元素
    public Long add(String key, Set<ZSetOperations.TypedTuple<Object>> tuples) {
        return zSetOps().add(key, tuples);
    }

    // 3. 获取元素的排名（升序排名，从0开始）
    public Long zRank(String key, Object value) {
        return zSetOps().rank(key, value);
    }

    // 4. 获取元素的排名（降序排名）
    public Long zRevRank(String key, Object value) {
        return zSetOps().reverseRank(key, value);
    }

    // 5. 获取元素的分数
    public Double zScore(String key, Object value) {
        return zSetOps().score(key, value);
    }

    // 6. 增加元素的分数
    public Double zIncrementScore(String key, Object value, double delta) {
        return zSetOps().incrementScore(key, value, delta);
    }

    // 7. 获取有序集合的大小
    public Long zSize(String key) {
        return zSetOps().size(key);
    }

    // 8. 获取指定排名范围的元素（升序）
    public Set<Object> zRange(String key, long start, long end) {
        return zSetOps().range(key, start, end);
    }

    // 9. 获取指定排名范围的元素（降序）
    public Set<Object> zRevRange(String key, long start, long end) {
        return zSetOps().reverseRange(key, start, end);
    }

    // 10. 获取指定分数范围的元素
    public Set<Object> zRangeByScore(String key, double min, double max) {
        return zSetOps().rangeByScore(key, min, max);
    }

    // 11. 删除元素
    public Long zRemove(String key, Object... values) {
        return zSetOps().remove(key, values);
    }

    // 12. 删除指定排名范围的元素
    public Long zRemoveRange(String key, long start, long end) {
        return zSetOps().removeRange(key, start, end);
    }

    // 13. 删除指定分数范围的元素
    public Long zRemoveRangeByScore(String key, double min, double max) {
        return zSetOps().removeRangeByScore(key, min, max);
    }

    // 14. 获取元素数量（按分数范围）
    public Long zCount(String key, double min, double max) {
        return zSetOps().count(key, min, max);
    }
}